package com.nuoniu.sibanyun.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.nuoniu.sibanyun.common.result.HttpResult;
import com.nuoniu.sibanyun.entity.SysCompany;
import com.nuoniu.sibanyun.entity.SysEmployee;
import com.nuoniu.sibanyun.entity.SysUser;
import com.nuoniu.sibanyun.entity.dto.SysUserDto;
import com.nuoniu.sibanyun.entity.vo.MenuVo;
import com.nuoniu.sibanyun.entity.vo.OfficeUserVo;
import com.nuoniu.sibanyun.entity.vo.SysEmployeeSimpleVo;
import com.nuoniu.sibanyun.entity.vo.UserSimpleVo;
import com.nuoniu.sibanyun.userThread.DataScope;
import com.nuoniu.sibanyun.userThread.UserInfo;
import org.aspectj.lang.ProceedingJoinPoint;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * <p>
 * 用户表 服务类
 * </p>
 *
 * @author baiqiang
 * @since 2020-04-23
 */
public interface ISysUserService extends IService<SysUser> {

    List<String> listRolesString(String userName);

    List<String> listPermissionsString(String userName);

    SysUser findByUserName(String userName);

    SysUser findByToken(HttpServletRequest request);

    UserSimpleVo getUserSimpleVo(HttpServletRequest request);

    UserInfo getUserInfo(String userName);

    Page<SysUserDto> getUserPage(SysUserDto userDto);
//    Page<SysEmployee> getUserPage(SysUserDto userDto);

    /**
     * 保存用户
     * @author 小啊刚
     * @date 2020/6/2
     */
    void saveUser(SysUserDto sysUser);

    /**
     * 删除用户
     * @author 小啊刚
     * @date 2020/6/3
     */
    void delete(Long userId);

    /**
     * 重置密码
     * @author 小啊刚
     * @date 2020/6/4
     */
    void resetPassword(SysUserDto user);

    /**
     * 更换系统管理员
     * @author 小啊刚
     * @date 2020/6/4
     */
    void updateSysManager(Long userId);

    /**
     * 分配角色
     * @author 小啊刚
     * @date 2020/6/6
     */
    void saveUserRole(List<Long> roleId, Long userId);

    /**
     * 注册用户
     * @author 小啊刚
     * @date 2020/6/10
     */
    HttpResult registerUser(Map<String, String> registerUser);

    /**
     * 发送手机验证码
     * @author 小啊刚
     * @date 2020/6/10
     */
    String sendUserCode(String userPhone, String remarks);

    /**
     * 注册校验用户
     * @author 小啊刚
     * @date 2020/6/10
     */
    HttpResult checkUser(String userPhone, String userName, String email, String companyName);

    /**
     * 根据手机号查询用户
     * @author 小啊刚
     * @date 2020/6/11
     */
    SysUser getUserByPhone(String userPhone);

    /**
     * 获取用户数据权限
     * @return
     */
    DataScope getUserDataScope(UserInfo userInfo);

    /**
     * 检查用户邮箱
     * @author 小啊刚
     * @date 2020-07-16
     */
    SysUser checkUserEmail(SysUser user);

    /**
     * 修改用户
     * @author 小啊刚
     * @date 2020-07-22
     */
    HttpResult updateUser(SysUser user);

    /**
     * 获取下级个人会员
     * @author 小啊刚
     * @date 2020-07-28
     */
    Page<SysUser> getShareUserList(Page page, SysUser user);

    /**
     * 获取下级公司会员
     * @author 小啊刚
     * @date 2020-07-29
     */
    Page<Map> getShareCrmList(Page page, SysCompany company);

    /**
     * 重置密码
     * @author 小啊刚
     * @date 2020-08-03
     */
    HttpResult resetPwd(Map<String, String> userInfo);

    /**
     * 入职注册
     * @author 小啊刚
     * @date 2020-08-04
     */
    HttpResult entryRegister(Map<String, String> registerUser);

    /**
     * 修改公司名称
     * @author 小啊刚
     * @date 2020-08-04
     */
    void updateCompanyName(SysCompany company);

    /**
     * 获取 当前用户 的数据权限用户 和 所有权限部门信息
     * @return
     */
    HashMap<String,Object> getDataScopeUsers();

    /**
     * 获取 当前用户 的数据权限用户
     * @return
     */
    List<OfficeUserVo> getOfficeUserVo();


    List<Integer> getOfficeAllUserIds(Integer companyId,Integer officeId);

    /**
     * 个人租户
     * @author 小啊刚
     * @date 2020-08-25
     */
    Page<SysUser> pageMember(Page page, SysUser user);

    /**
     * 升级为公司用户
     * @author 小啊刚
     * @date 2020-09-30
     */
    void updateUserType(UserInfo userInfo);

    /**
     * 保存用户日志
     * @author 小啊刚
     * @date 2021-03-01
     */
    void saveUserLog(ProceedingJoinPoint joinPoint, Object res, long time, HttpServletRequest request);

    /**
     * 邀请员工注册
     * @author 小啊刚
     * @date 2021-07-29
     */
    void smsRegister(Integer empId, String vCode);

    /**
     * 获取用户列表
     * @author 小啊刚
     * @date 2021-09-28
     */
    Page<SysUserDto> getPageList(SysUserDto userDto);

    /**
     * 根据真实姓名查询
     * @author 小啊刚
     * @date 2021-11-30
     */
    SysUser getByRealName(String realName);

    /**
     * 获取用户管理员
     * @author 小啊刚
     * @date 2022-01-07
     */
    SysUser getUserAdmin(Integer companyId);

    /**
     * 根据权限标识获取用户
     * @author 小啊刚
     * @date 2022-01-08
     */
    MenuVo getByMenuPermission(Integer companyId, String permission);

    /**
     * 获取我的所有推客
     * @author 小啊刚
     * @date 2022-05-23
     */
    List<SysUser> getShareUserAll();

    /**
     * 删除公司 转为个人用户
     * @author 小啊刚
     * @date 2022-06-01
     */
    void updateCompanyType();

    /**
     * 离职
     * @author 小啊刚
     * @date 2022-06-01
     */
    void quit(Integer userId);
    //*****************************zy修改*******************************************
    SysUser getByUserId(Long id);

    /**
     * 通过 机构ID(部门ID)查询员工信息
     * @param officeId
     * @return
     */
    Page<SysEmployeeSimpleVo> pageSysEmployeeSimpleVo(Page page, Integer officeId, String searchKey);

    /**
     * 导入员工
     * @author 小啊刚
     * @date 2021-07-21
     */
    Map importEmployee(MultipartFile file) throws IOException, NoSuchFieldException;

    /**
     * 获取员工列表
     * @author 小啊刚
     * @date 2021-07-21
     * @return
     */
    Page<SysUser> pageList(Page page);

    /**
     * 下载导入模版
     * @author 小啊刚
     * @date 2021-07-21
     */
    void importTemplate(HttpServletResponse response);


    /**
     * 邀请注册
     * @author 小啊刚
     * @date 2021-07-24
     */
    void inviteToRegister(String[] userPhones);

    void deletebyid(Long id);
}
